/**
 * 是否有摄像头
 * @return {Promise<boolean>}
 */
async function hasCamera() {
    try {
        const devices = await navigator.mediaDevices.enumerateDevices();
        // 查找类型为 "videoinput" 的设备
        return devices.some(device => device.kind === 'videoinput');
    } catch (error) {
        console.warn('Error enumerating media devices:', error);
        return false; // 如果发生错误，默认认为没有摄像头
    }
}

/**
 * 是否有麦克风
 * @return {Promise<boolean>}
 */
async function hasMicrophone() {
    try {
        const devices = await navigator.mediaDevices.enumerateDevices();
        // 查找类型为 "audioinput" 的设备
        return devices.some(device => device.kind === 'audioinput');
    } catch (error) {
        console.warn('Error enumerating media devices:', error);
        return false; // 如果发生错误，默认认为没有麦克风
    }
}

/**
 * stream是否开包含音频轨
 * @param stream
 */
function hasAudioTrack(stream) {
    const audioTracks = stream.getAudioTracks();
    return audioTracks.length > 0;
}

/**
 * stream是否开启了音频
 * 音频轨道是否处于启用状态（即是否正在发送音频数据）
 * @param stream
 * @return {boolean}
 */
function hasAudioEnabled(stream) {
    const audioTracks = stream.getAudioTracks();
    for (let track of audioTracks) {
        if (track.enabled) {
            return true;
        }
    }
    return false;
}

function closeCamera(videoEle) {
    if (videoEle && videoEle.srcObject) {
        videoEle.srcObject.getTracks().forEach(
            track => {
                track.stop();
            }
        );
        videoEle.srcObject = null;
    }
}

/**
 * 获取本地音视频流对象
 * @returns localStream
 * @param onlyAudio
 */
async function getLocalStream(onlyAudio = false) {
    if (navigator.mediaDevices === undefined) {
        console.warn("获取不到navigator.mediaDevices")
        return null;
    }
    const isCamera = await hasCamera();
    const isMicro = await hasMicrophone();
    try {
        return await navigator.mediaDevices.getUserMedia({
            video: !onlyAudio && isCamera,
            audio: isMicro,
        });
    } catch (error) {
        handleError(error)
        return null;
    }
}

function handleError(error) {
    console.error('Error accessing media devices.', error);
    switch (error.name) {
        case 'NotAllowedError':
            alert('您拒绝了媒体访问权限或浏览器窗口不在前台。');
            break;
        case 'NotFoundError':
            alert('未找到摄像头或麦克风。您的设备可能不支持音频输入。');
            // 如果是找不到音频设备，可以提供仅视频的选项
            break;
        case 'NotReadableError':
            alert('摄像头或麦克风正在被其他进程使用，或者系统资源不足。');
            break;
        case 'OverconstrainedError':
            alert('您的设备不支持指定的媒体约束条件。');
            break;
        default:
            alert('发生了一个错误：' + error.message);
    }
}


export {
    hasCamera,
    hasMicrophone,
    getLocalStream,
    hasAudioTrack,
    hasAudioEnabled,
    closeCamera,
}